package com.shengdong.water.code.adapter // 假设你的 adapter 在这个包下

import android.content.Context
import android.graphics.Typeface
import android.util.Log
import android.view.Gravity
import android.widget.HorizontalScrollView
import android.widget.LinearLayout
import android.widget.TextView

import androidx.core.view.marginStart
import androidx.recyclerview.widget.RecyclerView // 用于 setHorizontalScrollForVisibleRow
import com.shengdong.water.R
import com.shengdong.water.code.base.BaseRecyclerAdapter // 你的 BaseRecyclerAdapter
import com.shengdong.water.databinding.ItemRowDataBinding // 生成的 Binding 类

class DataRowAdapter(
    private val context: Context,
    initialDataMap: Map<String, String>, // 初始数据
    private val headerOrder: List<String>,
    private val onRowScrolled: (scrollView: HorizontalScrollView, scrollX: Int) -> Unit,
    private var externalScrollX: Int = 0 // 用于从外部 Activity/Fragment 控制滚动
) : BaseRecyclerAdapter<Map<String, String>, ItemRowDataBinding>() { // 移除了父构造函数的 items 参数，因为BaseRecyclerAdapter内部管理

    init {
        // 使用 BaseRecyclerAdapter 的方法来设置初始数据
        if (initialDataMap.isNotEmpty()) {
            super.setItems(listOf(initialDataMap))
        } else {
            super.setItems(emptyList())
        }
    }

    // 更新 RecyclerView 中的单行数据
    fun updateSingleRowData(newDataMap: Map<String, String>) {
        if (newDataMap.isNotEmpty()) {
            super.setItems(listOf(newDataMap)) // 调用 BaseRecyclerAdapter 的 setItems
        } else {
            super.setItems(emptyList())
        }
    }

    // 从外部设置滚动位置，通过触发重绑定来应用
    fun setHorizontalScrollForVisibleRow(scrollX: Int) {
        this.externalScrollX = scrollX
        if (itemCount > 0) { // 确保有数据项
            notifyItemChanged(0) // 触发第0项的 onBindViewHolder -> bindData
        }
    }

    override fun getLayoutId() =  R.layout.item_row_data


    override fun bindData(
        binding: ItemRowDataBinding,
        itemDataMap: Map<String, String>, // item 是 Map<String, String>
        position: Int // position 会是 0
    ) {
        // super.bindData(binding, itemDataMap, position) // 如果基类有默认实现且需要调用

        val dataCellsLayout: LinearLayout = binding.itemDataCells
        val rowScrollView: HorizontalScrollView = binding.itemRowScrollView
        var isProgrammaticScroll = false // 局部变量，用于防止此ViewHolder内的滚动回调循环

        // 清除旧的监听器以避免内存泄漏或重复调用（虽然对于单项ViewHolder影响不大，但良好实践）
        rowScrollView.setOnScrollChangeListener(null)
        // 设置滚动监听
        rowScrollView.setOnScrollChangeListener { _, scrollXInListener, _, _, _ ->
            if (!isProgrammaticScroll) { // 只有用户滚动时才回调
                onRowScrolled(rowScrollView, scrollXInListener)
            }
        }

        dataCellsLayout.removeAllViews() // 清空之前的单元格
        headerOrder.forEach { headerKey ->
            val value = itemDataMap[headerKey] ?: "-"
            val textView = TextView(context).apply {
                this.text = value
                layoutParams = LinearLayout.LayoutParams(
                    context.resources.getDimensionPixelSize(R.dimen.dp150),
                    LinearLayout.LayoutParams.WRAP_CONTENT
                ).also { params ->
                    if (dataCellsLayout.childCount > 0) { // 给非第一个单元格添加左边距作为分隔
                        params.marginStart = context.resources.getDimensionPixelSize(R.dimen.dp1)
                    }
                }
                setPadding(
                    context.resources.getDimensionPixelSize(R.dimen.dp10),
                    context.resources.getDimensionPixelSize(R.dimen.dp10),
                    context.resources.getDimensionPixelSize(R.dimen.dp10),
                    context.resources.getDimensionPixelSize(R.dimen.dp10)
                )
                gravity = Gravity.CENTER
                // 你可以在这里根据需要设置文字颜色、字体等
            }
            dataCellsLayout.addView(textView)
        }

        // 应用外部设置的滚动位置（在下一次布局完成后执行，以确保视图尺寸已确定）
        rowScrollView.post {
            isProgrammaticScroll = true
            rowScrollView.scrollTo(externalScrollX, 0)
            isProgrammaticScroll = false
        }

        binding.executePendingBindings()
    }

    // 如果你的 BaseRecyclerAdapter 的 areItemsTheSame 和 areContentsTheSame
    // 默认实现对于 Map<String, String> 不合适（例如，它们比较引用而不是内容），
    // 你可能需要重写它们。但对于单项列表，DiffUtil 的影响较小。
    // 不过，为了完整性：
    override fun areItemsTheSame(oldItem: Map<String, String>, newItem: Map<String, String>): Boolean {
        // 对于单行数据，如果它们都存在，可以认为它们是同一个逻辑项
        // 或者，如果你的 Map 有一个唯一的ID键，可以用它来比较
        return true // 因为我们总是替换整个单行
    }

    override fun areContentsTheSame(oldItem: Map<String, String>, newItem: Map<String, String>): Boolean {
        // 比较 Map 的内容
        return oldItem == newItem
    }
}
